import 'package:get/get.dart' hide SnackPosition;
import 'package:flutter/material.dart';
import '../../common/index.dart';
import '../chatList/controller.dart';

class ChatController extends GetxController {
  ChatController();

  // 当前聊天对象的用户ID
  late String target_user_id;

  // 当前用户ID
  String? current_user_id;

  // 聊天消息列表
  final RxList<ChatModel> chat_messages = <ChatModel>[].obs;

  // 消息输入控制器
  final text_controller = TextEditingController();

  // 滚动控制器
  final ScrollController scroll_controller = ScrollController();

  // 目标用户信息
  Rxn<UserModel> target_user = Rxn<UserModel>();

  // 初始化数据 - 公开方法，可以从外部调用
  void init_data() async {
    debugPrint('正在与用户 $target_user_id 聊天');

    // 获取当前用户
    current_user_id = UserService().get_now_user()?.id;
    if (current_user_id == null) {
      debugPrint('用户未登录');
      return;
    }

    // 获取目标用户信息
    target_user.value = UserService().get_user_data_by_id(target_user_id);
    debugPrint('目标用户: ${target_user.value?.name}');

    // 加载聊天记录
    await _load_chat_messages();

    // 延迟一下再标记为已读，确保UI先显示
    Future.delayed(Duration(milliseconds: 300), () {
      // 标记所有收到的消息为已读
      _mark_messages_as_read();
    });

    update(["chat"]);
  }

  // 初始化数据 - 私有方法，用于GetX方式的初始化
  _init_data() async {
    // 获取传递的参数
    if (Get.arguments != null && Get.arguments['userId'] != null) {
      target_user_id = Get.arguments['userId'];
      init_data(); // 复用公共的初始化逻辑
    } else {
      debugPrint('未传递用户ID参数');
    }
  }

  // 加载聊天记录
  Future<void> _load_chat_messages() async {
    if (current_user_id == null || target_user_id.isEmpty) return;

    try {
      final messages = await ChatService().get_visible_chats_between_users(
        current_user_id!,
        target_user_id,
      );

      // 按时间排序
      messages.sort(
        (a, b) => DateTime.parse(
          a.created_time,
        ).compareTo(DateTime.parse(b.created_time)),
      );

      chat_messages.value = messages;
      debugPrint('加载了 ${chat_messages.length} 条聊天记录');

      // 延迟一下，确保UI更新后再滚动
      Future.delayed(Duration(milliseconds: 100), scroll_to_bottom);
    } catch (e) {
      debugPrint('加载聊天记录错误: $e');
    }
  }

  // 将收到的消息标记为已读
  void _mark_messages_as_read() async {
    if (current_user_id == null) return;

    // 使用批量标记已读方法
    bool success = await ChatService().mark_all_as_read(
      current_user_id!,
      target_user_id,
    );

    if (success) {
      // 重新加载数据以确认消息已被标记为已读
      await _load_chat_messages();
      debugPrint('批量标记消息为已读完成');
    }
  }

  // 滚动到最新消息
  void scroll_to_bottom() {
    if (scroll_controller.hasClients) {
      scroll_controller.animateTo(
        scroll_controller.position.maxScrollExtent,
        duration: Duration(milliseconds: 300),
        curve: Curves.easeOut,
      );
    }
  }

  // 发送消息
  Future<void> send_message() async {
    if (text_controller.text.trim().isEmpty || current_user_id == null) return;

    final content = text_controller.text.trim();
    final now = DateTime.now().toIso8601String();

    // 创建新消息
    final newMessage = ChatModel(
      chat_id: 'msg_${now}_${current_user_id}_${target_user_id}',
      detail: content,
      spend_user_id: current_user_id!,
      receive_user_id: target_user_id,
      created_time: now,
      is_reading: false,
    );

    // 发送消息
    final success = await ChatService().send_message(newMessage);

    if (success) {
      // 清空输入框
      text_controller.clear();

      // 重新加载消息
      await _load_chat_messages();

      // 滚动到底部显示最新消息
      Future.delayed(Duration(milliseconds: 100), scroll_to_bottom);

      debugPrint('发送消息成功');
    } else {
      debugPrint('发送消息失败');
    }
  }

  // 举报用户
  Future<void> report_user(BuildContext context, String reason) async {
    // 检查用户是否登录
    if (current_user_id == null) {
      SmartDialogHelper.show_warning('please login first before using chat');
      RouteUtil.push(RouteNames.login);
      return;
    }

    // 关闭报告对话框
    RouteUtil.pop();

    // 显示处理中的提示
    SmartDialogHelper.showLoading(msg: "Processing...");

    try {
      // 只隐藏当前时间点之前的聊天记录，而不是所有聊天记录
      bool success = await ChatService().hide_previous_chats_for_current_user(
        current_user_id!,
        target_user_id,
      );

      // 关闭加载对话框
      SmartDialogHelper.dismiss();

      if (success) {
        // 显示成功消息
        SmartDialogHelper.show_success(
          'user has been reported, previous messages have been hidden',
        );

        // 重新加载聊天记录，只显示未隐藏的消息
        await _load_chat_messages();

        // 检查是否存在ChatListController，如果存在则刷新
        if (Get.isRegistered<ChatListController>()) {
          final chatListController = Get.find<ChatListController>();
          chatListController.refresh_chat_list();
        }
      } else {
        // 显示错误消息
        SmartDialogHelper.show_error('Failed to process the request');
      }
    } catch (e) {
      // 关闭加载对话框
      SmartDialogHelper.dismiss();
      debugPrint('举报处理错误: $e');

      // 显示错误消息
      SmartDialogHelper.show_error('failed to report user, please try again');
    }
  }

  // 计算闰年
  bool is_leap_year(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
  }

  @override
  void onInit() {
    super.onInit();
    _init_data();
  }

  @override
  void onClose() {
    text_controller.dispose();
    scroll_controller.dispose();
    super.onClose();
  }
}
